package runtime

import (
	"strings"
)

// Query 表示一个 SQL 查询和其参数
type Query struct {
	sql  string
	args []interface{}
}

// NewQuery 创建一个新的查询实例
func NewQuery(sql string, args ...interface{}) *Query {
	return &Query{
		sql:  sql,
		args: args,
	}
}

// String 返回 SQL 查询字符串
func (q *Query) String() string {
	return q.sql
}

// Args 返回查询参数
func (q *Query) Args() []interface{} {
	return q.args
}

// SQL 返回格式化的 SQL 字符串（仅用于调试）
func (q *Query) SQL() string {
	return q.sql
}

// AddArg 添加一个参数
func (q *Query) AddArg(arg interface{}) {
	q.args = append(q.args, arg)
}

// QueryBuilder 用于构建动态查询
type QueryBuilder struct {
	parts []string
	args  []interface{}
}

// NewQueryBuilder 创建一个新的查询构建器
func NewQueryBuilder() *QueryBuilder {
	return &QueryBuilder{
		parts: make([]string, 0),
		args:  make([]interface{}, 0),
	}
}

// AddText 添加文本片段
func (qb *QueryBuilder) AddText(text string) *QueryBuilder {
	qb.parts = append(qb.parts, text)
	return qb
}

// AddParam 添加参数化查询片段
func (qb *QueryBuilder) AddParam(arg interface{}) *QueryBuilder {
	qb.parts = append(qb.parts, "?")
	qb.args = append(qb.args, arg)
	return qb
}

// Build 构建最终的查询
func (qb *QueryBuilder) Build() *Query {
	sql := strings.Join(qb.parts, "")
	return &Query{
		sql:  sql,
		args: qb.args,
	}
}
